package com.zanglikun;


import cn.hutool.http.HttpUtil;

import java.io.*;

/**
 * 用来检测目标Windows服务器UDP端口是否开放！
 * 开放端口暴露HTTP服务，请求进来，在服务器上来执行bat脚本，通过结果返回值，返回给监控。
 */
public class HutoolSimpleHttpServer {

    public static void main(String[] args) {
        // 指定占用的端口是：8080
        int httpServerPort = 8080;
        if (args != null && args.length > 0) {
            httpServerPort = Integer.valueOf(args[0]);
        }
        // 浏览器发起的请求是：http://75.ff11sf.com:54890/checkServerAlive?port=54230
        HttpUtil.createServer(httpServerPort)
                .addAction("/", (req, res) -> {
                    res.setHeader("Content-Type", "text/html; charset=UTF-8");  // 设置字符编码
                    res.write("Hello FFXI Check Server Alive is Running！");
                    res.write("服务监控 已开启！");
                })
                .addAction("/checkServerAlive", (request, response) -> {
                    try {
                        // 脚本位置
                        String scriptPath = "checkLocalUDPPort.bat";

                        // 这是从请求中获取port参数。
                        String port = request.getParam("port");
                        String[] command = {"cmd.exe", "/c", scriptPath, port};

                        // 执行脚本
                        ProcessBuilder processBuilder = new ProcessBuilder(command);
                        Process process = processBuilder.start();

                        // 读取脚本输出
                        BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
                        String line;
                        while ((line = reader.readLine()) != null) {
                            //System.out.println(line);
                        }

                        // 等待进程执行结束并获取返回值
                        int exitCode = process.waitFor();
                        //System.out.println("批处理文件执行完毕，返回值为: " + exitCode);
                        response.write(String.valueOf(exitCode));

                    } catch (Exception e) {
                        // 不抛出任何脚本
                        e.printStackTrace();
                    }
                })
                .start();
    }
}
